Author: Dave Nilsen
Date: 05/21/2020
*This is an R Markdown Notebook.

Introduction

The purpose of this report is to analyze King County’s ability to provide educational opportunities to its resident student populations. The analysis will draw a correlation between five separate variables to create an “Educational Opportunity Index” of King County. These variables will include School Reading Proficiency, School Math Proficiency, Student Poverty Rates, Teacher Qualifications, and Graduation Rates. These variables were chosen by the Growing Transit Communities partnership with the study area being the central Puget Sound region. This study will expand the scope of the original study to include the entire King County region.

Opportunity mapping can provide a visual reference per subregion of a study to find a correlation or to compare the subregions within the scope of the study. This study divides sub-regions by the defined boundaries of the 2010 Census Tract areas. The data collected in these census tracts will be standardized (see Methods), and given a weighted value, and then divided into 5 standard classes. This data will then be visualized by a color scale to represent these classes. The result map will indicate census tracts that fall within the scale of opportunity-Very Low to Very High.

The Opportunity Index Map will show the distribution of education opportunity throughout King County. This will give officials and residents a representation of the current state of educational opportunity within the county. This data can be used to recognize subregions that are below the mean and work towards a comprehensive plan to address these shortcomings.

Discussion

Measurements of Opportunity

This study uses the following five variables to generate an Education Opportunity Index:

  1. School Reading Proficiency
    1. Description: The school proficiency rate on the 4th-grade reading exam (WASL)
    2. Field Code: EDU1
    3. Data Source: Washington State Report Card, Office of Superintendent of Public Instruction (OSPI)
    4. Field Code: EDU1
    5. Data Source: Washington State Report Card, Office of Superintendent of Public Instruction (OSPI)
    6. Geography: Point-based, School locations
    7. Date: 2010-2011 school year
    8. Methodology: Each tract was assigned the average of the reading proficiency scores of the three elementary schools nearest the tract centroid. This process also considered school district boundaries, so as to assign data to tracts only according to the district in which the tract resides.
  2. School Math Proficiency
    1. Description: The school proficiency rate on the 4th-grade mathematics exam (WASL)
    2. Field Code: EDU2
    3. Data Source: Washington State Report Card, Office of Superintendent of Public Instruction (OSPI)
    4. Geography: Point-based, School locations
    5. Date: 2010-2011 school year
    6. Methodology: Each tract was assigned the average of the mathematics proficiency scores of the three elementary schools nearest the tract centroid. This process also considered school district boundaries, so as to assign data to tracts only according to the district in which the tract resides.
  3. Student Poverty Rates
    1. Description: The percentage of elementary school students receiving free or reduced-price lunches
    2. Field Code: EDU3
    3. Data Source: Washington State Report Card, Office of Superintendent of Public Instruction (OSPI)
    4. Geography: Point-based, School locations
    5. Date: 2010-2011 school year
    6. Methodology: Each tract was assigned the student poverty rate of the three elementary schools nearest the tract centroid. This process also considered school district boundaries, so as to assign data to tracts only according to the district in which the tract resides.
  4. Teacher Qualifications
    1. Description: The percentage of teachers who have obtained a master’s degree or more
    2. Field Code: EDU4
    3. Data Source: Washington State Report Card, Office of Superintendent of Public Instruction (OSPI)
    4. Geography: Point-based, School locations
    5. Date: 2010-2011 school year
    6. Methodology: Each tract was assigned the teacher master’s achievement rate of the three elementary schools nearest the tract centroid. This process also considered school district boundaries, so as to assign data to tracts only according to the district in which the tract resides.
  5. Graduation Rates
    1. Description: The percentage of students who graduated from high school on time
    2. Field Code: EDU5
    3. Data Source: Washington State Report Card, Office of Superintendent of Public Instruction (OSPI)
    4. Geography: Point-based, School locations
    5. Date: 2010-2011 school year
    6. Methodology: Each tract was assigned the graduation rate of the three high schools nearest the tract centroid. This process also considered school district boundaries, so as to assign data to tracts only according to the district in which the tract resides.
(Central Puget Sound Opportunity Indicators Metadata)

Measurements of Opportunity Explained

These five variables when compared to each other show some correlation to the Puget Sound Region as having the most diverse spread of Education Opportunities. This region has some of the highest and lowest levels of opportunity, when compared to the rest of King County. The following is a summary of each of the five measurements of opportunity before the corresponding weight is calculated into the equation.

  1. School Reading Proficiency
  2. KingEduJson <- geojsonio::geojson_read("King_edu.json", what = "sp")
    summary(KingEduJson$EDU1)
    ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    ##   31.96   61.31   73.55   71.52   83.14   93.47
    1. Weighted: 4
  3. School Math Proficiency
  4. summary(KingEduJson$EDU2)
    ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    ##   27.14   53.90   67.49   65.44   78.60   90.84
    1. Weighted: 4
  5. Student Poverty Rates
  6. summary(KingEduJson$EDU3)
    ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    ##  0.0000  0.1656  0.3229  0.3866  0.6167  0.8931
    1. Weighted: 3
  7. Teacher Qualifications
  8. summary(KingEduJson$EDU4)
    ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    ##  0.0000  0.5770  0.6312  0.5751  0.6883  0.8277
    1. Weighted: 2
  9. Graduation Rates
  10. summary(KingEduJson$EDU5)
    ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    ##  0.2649  0.7653  0.8272  0.8103  0.8836  0.9631
    1. Weighted: 1

The weights used in this study were influenced by Vassilev’s Educational Indicators. The resulting weights give more value to the measurement of student academic achievement as they are a measure of students’ academic knowledge. Student Poverty Rates is the next highest weight as socioeconomic situations may have an impact of student’s educational opportunities. Teacher Qualification is second from the last as the level of advanced education may not directly correlate to their ability to teach students. The last of the variable to be weighted is Graduation Rates, as they are not necessarily related to the entire student populations within King County. Students graduating in King County may not have been a resident during their primary education or have moved within different census tracts which may not be a complete representation of the data, resulting in less valued data than the previous variables.

These five variables when compared to each other show some correlation to the Puget Sound Region as having the most diverse spread of Education Opportunities. This region has some of the highest and lowest levels of opportunity, when compared to the rest of King County. The flowing is a summary each of the five measurements of opportunity before the corresponding weight is calculated into the equation

Methods

The methods used in this study begin with converting the initial data set KingEdu1.shp from shapefile to GeoJSON. This conversion was processed within ArcGIS Pro 2.5.0, utilizing the Features To JSON tool. Upon output the file was converted to GeoJSON and projected into WGS_1984 to be used in a web-based map. The newly converted GeoJSON (KingEduJson) was then read into RStudio in the R Notebook format using R version 4.0. The rest of the analysis is detailed in the following:

Load Libraries

library(leaflet)
library(sp)
library(rgdal)
## rgdal: version: 1.4-8, (SVN revision 845)
##  Geospatial Data Abstraction Library extensions to R successfully loaded
##  Loaded GDAL runtime: GDAL 2.2.3, released 2017/11/20
##  Path to GDAL shared files: C:/Users/super/Documents/R/win-library/4.0/rgdal/gdal
##  GDAL binary built with GEOS: TRUE 
##  Loaded PROJ.4 runtime: Rel. 4.9.3, 15 August 2016, [PJ_VERSION: 493]
##  Path to PROJ.4 shared files: C:/Users/super/Documents/R/win-library/4.0/rgdal/proj
##  Linking to sp version: 1.4-1
library(geojsonio)
## 
## Attaching package: 'geojsonio'
## The following object is masked from 'package:base':
## 
##     pretty
library(knitr)
library(formattable)
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(Hmisc)
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
## 
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(htmltools)

Read in GeoJson

KingEduJson <- geojsonio::geojson_read("King_edu.json", what = "sp")
class(KingEduJson)
## [1] "SpatialPolygonsDataFrame"
## attr(,"package")
## [1] "sp"

View Attributes Names

names(KingEduJson)
##  [1] "FID"        "GEOID10"    "NAMELSAD10" "ALAND10"    "AWATER10"  
##  [6] "INTPTLAT10" "INTPTLON10" "UGA"        "Shape_Leng" "Shape_Area"
## [11] "EDU1"       "EDU2"       "EDU3"       "EDU4"       "EDU5"

Clean data set of Missing values

This process removes any missing valuse in the data set and converts it to “0” to avoid further errors later on

EDU1 <- KingEduJson$EDU1
EDU1[is.na(EDU1)] <- 0  ##This changes any missing data to 0

EDU2 <- KingEduJson$EDU2
EDU2[is.na(EDU2)] <- 0  ##This changes any missing data to 0

EDU3 <- KingEduJson$EDU3
EDU3[is.na(EDU3)] <- 0  ##This changes any missing data to 0

EDU4 <- KingEduJson$EDU4
EDU4[is.na(EDU4)] <- 0  ##This changes any missing data to 0

EDU5 <- KingEduJson$EDU5
EDU5[is.na(EDU5)] <- 0  ##This changes any missing data to 0

Determing Zscore for Variables

The formula used for determining z-scores is as follows: z-score = (x – mean(x) / standard deviation(x)

EDU1_zScore <- (EDU1 - mean(EDU1)) / sd(EDU1)
EDU2_zScore <- (EDU2 - mean(EDU2)) / sd(EDU2)
EDU3_zScore <- (EDU3 - mean(EDU3)) / sd(EDU3)
EDU4_zScore <- (EDU4 - mean(EDU4)) / sd(EDU4)
EDU5_zScore <- (EDU5 - mean(EDU5)) / sd(EDU5)
head(EDU1_zScore, 5)
## [1]  1.0161954  1.1344750 -0.3820798  0.1990827  0.9167861
head(EDU2_zScore, 5)
## [1]  0.83839381  0.96551599 -0.28476873  0.09170696  1.26796537
head(EDU3_zScore, 5)
## [1] -0.8216048 -1.1552875  0.1265868  0.5070739 -1.1427794
head(EDU4_zScore, 5)
## [1]  0.2592494  0.1972539  0.3273972 -2.7217412  0.6993703
head(EDU5_zScore, 5)
## [1] 0.8407906 0.6132709 0.2522557 0.1993728 1.2885945

Absolute Value of Z-Scores

This process converts selected numerical values into absolute values as negative values are not necessary in this study.

EDU1_zScore <- abs(EDU1_zScore)
EDU2_zScore <- abs(EDU2_zScore)
EDU3_zScore <- abs(EDU3_zScore)
EDU4_zScore <- abs(EDU4_zScore)
EDU5_zScore <- abs(EDU5_zScore)
head(EDU1_zScore, 5)
## [1] 1.0161954 1.1344750 0.3820798 0.1990827 0.9167861
head(EDU2_zScore, 5)
## [1] 0.83839381 0.96551599 0.28476873 0.09170696 1.26796537
head(EDU3_zScore, 5)
## [1] 0.8216048 1.1552875 0.1265868 0.5070739 1.1427794
head(EDU4_zScore, 5)
## [1] 0.2592494 0.1972539 0.3273972 2.7217412 0.6993703
head(EDU5_zScore, 5)
## [1] 0.8407906 0.6132709 0.2522557 0.1993728 1.2885945

Add Z-Score Columns to KingEduJson

KingEduJson$EDU1_zScore <- EDU1_zScore
KingEduJson$EDU2_zScore <- EDU2_zScore
KingEduJson$EDU3_zScore <- EDU3_zScore
KingEduJson$EDU4_zScore <- EDU4_zScore
KingEduJson$EDU5_zScore <- EDU5_zScore
#head(KingEduJson, 3)

Calculate Average Z-Scores and Add Absoulte Values to Column EduComp

EducComp <- abs((EDU1_zScore + EDU2_zScore + EDU3_zScore + EDU4_zScore + EDU5_zScore) / 5)
KingEduJson$EducComp <- EducComp
#head(KingEduJson, 3)

Creating Weigthed Variables and Add to KingEduJson

#Indicatior weights were based of: http://wikiprogress.org/articles/education-and-skills/educational-indicators/#What_should_an_education_indicator_measure

EDU1w <- EDU1_zScore*4 #School Reading Proficiency
EDU2w <- EDU2_zScore*4 #School Math Proficiency
EDU3w <- EDU3_zScore*3 #Student Poverty Rates
EDU4w <- EDU4_zScore*2 #Teacher Qualifications
EDU5w <- EDU5_zScore*1 #Graduation Rates
ECWeighted <- ((EDU1w + EDU2w + EDU3w + EDU4w + EDU5w) / 5)
KingEduJson$ECWeighted <- ECWeighted
#head(KingEduJson, 3)

Six Number Summary of ECWeighted

summary(ECWeighted)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.1151  1.4709  2.2510  2.3004  2.9798  5.5218

Determining Class Interval

Class interval was determined for all the variables data sets with this formula: ci = (max(x) – min(x) / 5

#class intrerval = (Max-Min)/Breaks
ci <- (max(ECWeighted, na.rm = T) - min(ECWeighted, na.rm = T))/5
ci
## [1] 1.081341

Cut data into Catorgizes

The ECWeighted column was divided into five categories with the following formula:
Bins = (-Inf, x + class interval, x + class interval * 2, x + class interval * 3, x + class interval * 4, Inf)
Labels = (“1 – Very Low”,“2 – Low”,“3 – Moderate”,“4 – High”,“5 - Very High”)

b <- c(-Inf, 0.1151 + ci ,0.1151 + ci*2, 0.1151 + ci*3, 0.1151 + ci*4, Inf)
l <- c("1 – Very Low","2 – Low","3 – Moderate","4 – High","5 - Very High")
c1 <- cut(ECWeighted, b, l)
KingEduJson$EduScore <- c1
#head(KingEduJson)
#c1

Convert Graduation Rates from Decimal to Percentage

Converting the data into percentages allows for a clearer understanding of the data in its finial form.

x <- c(KingEduJson$EDU5)
x <- percent(x)
head(x, 3)
## [1] 90.39% 87.86% 83.84%

Clean Finial Data

This is a finial cleaning of any missing data within the ECWeighted Column

ECWeighted <- KingEduJson$ECWeighted
ECWeighted[is.na(ECWeighted)] <- 0  ##This changes any missing data to 0

KingEduJson$ECWeighted <- ECWeighted

Summary of KingEduJson

summary(KingEduJson)
## Object of class SpatialPolygonsDataFrame
## Coordinates:
##          min        max
## x -122.53181 -121.06572
## y   47.08446   47.78033
## Is projected: FALSE 
## proj4string :
## [+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0]
## Data attributes:
##       FID        GEOID10           NAMELSAD10           ALAND10         
##  Min.   :  0   Length:397         Length:397         Min.   :2.291e+05  
##  1st Qu.: 99   Class :character   Class :character   1st Qu.:1.628e+06  
##  Median :198   Mode  :character   Mode  :character   Median :2.766e+06  
##  Mean   :198                                         Mean   :1.380e+07  
##  3rd Qu.:297                                         3rd Qu.:4.650e+06  
##  Max.   :396                                         Max.   :1.390e+09  
##     AWATER10         INTPTLAT10         INTPTLON10            UGA           
##  Min.   :       0   Length:397         Length:397         Length:397        
##  1st Qu.:       0   Class :character   Class :character   Class :character  
##  Median :    5753   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :  644492                                                           
##  3rd Qu.:  388852                                                           
##  Max.   :27317733                                                           
##    Shape_Leng        Shape_Area             EDU1            EDU2      
##  Min.   :0.02384   Min.   :0.0000274   Min.   :31.96   Min.   :27.14  
##  1st Qu.:0.06783   1st Qu.:0.0002128   1st Qu.:61.31   1st Qu.:53.90  
##  Median :0.09444   Median :0.0003564   Median :73.55   Median :67.49  
##  Mean   :0.13707   Mean   :0.0017055   Mean   :71.52   Mean   :65.44  
##  3rd Qu.:0.13723   3rd Qu.:0.0006397   3rd Qu.:83.14   3rd Qu.:78.60  
##  Max.   :2.54729   Max.   :0.1696872   Max.   :93.47   Max.   :90.84  
##       EDU3             EDU4             EDU5         EDU1_zScore    
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.2649   Min.   :0.0170  
##  1st Qu.:0.1656   1st Qu.:0.5770   1st Qu.:0.7653   1st Qu.:0.5057  
##  Median :0.3229   Median :0.6312   Median :0.8272   Median :0.7976  
##  Mean   :0.3866   Mean   :0.5751   Mean   :0.8103   Mean   :0.8588  
##  3rd Qu.:0.6167   3rd Qu.:0.6883   3rd Qu.:0.8836   3rd Qu.:1.2166  
##  Max.   :0.8931   Max.   :0.8277   Max.   :0.9631   Max.   :2.8023  
##   EDU2_zScore        EDU3_zScore        EDU4_zScore        EDU5_zScore      
##  Min.   :0.001674   Min.   :0.001506   Min.   :0.001037   Min.   :0.009565  
##  1st Qu.:0.403414   1st Qu.:0.530288   1st Qu.:0.156081   1st Qu.:0.243817  
##  Median :0.849240   Median :0.897460   Median :0.382767   Median :0.591080  
##  Mean   :0.852861   Mean   :0.886189   Mean   :0.630916   Mean   :0.734896  
##  3rd Qu.:1.248973   3rd Qu.:1.180895   3rd Qu.:0.667663   3rd Qu.:0.938567  
##  Max.   :2.541499   Max.   :2.043548   Max.   :2.721741   Max.   :4.895487  
##     EducComp         ECWeighted              EduScore  
##  Min.   :0.06983   Min.   :0.1151   1 – Very Low : 64  
##  1st Qu.:0.53034   1st Qu.:1.4709   2 – Low      :139  
##  Median :0.78045   Median :2.2510   3 – Moderate :136  
##  Mean   :0.79273   Mean   :2.3004   4 – High     : 48  
##  3rd Qu.:1.02996   3rd Qu.:2.9798   5 - Very High: 10  
##  Max.   :1.71248   Max.   :5.5218

Results

The following maps are the result of the analysis above. These maps are interactive and reproducible.


Oppertunity Index Map

EduScore <-KingEduJson$EduScore
NAMELSAD10 <- KingEduJson$NAMELSAD10
EDU0 <- ECWeighted
#summary(EDU0)
EDU0ci <- (max(EDU0, na.rm = T) - min(EDU0, na.rm = T))/5
EDU0var <- EDU0ci
EDU0b <- c(-Inf, EDU0var + EDU0ci, EDU0var+ EDU0ci*2, EDU0var+EDU0ci*3, EDU0var+ EDU0ci*4, Inf)#%>%
  #percent()
#head(EDU0b_test, 5)
EDU0l <- c("1 – Very Low","2 – Low","3 – Moderate","4 – High","5 - Very High")
EDU0c1 <- cut(EDU0, EDU0b, EDU0l)
EDU0pal <- colorBin("YlOrRd", domain = EDU0, bins = EDU0b)

EDU0labels <- sprintf(
  "<p><center>Test Scores:</p><h5>Reading: <strong>%s</strong></h5>
  <h5><center>Math: <strong>%s</strong></h5> 
  <h5><center>Graduation Rates: <strong>%s</strong></h5>
  <h5><center>Opertunity Index: <strong>%s</strong></h5>
  <h6><center>%s</h6>",
  EDU1, EDU2, x, EduScore, NAMELSAD10
) %>% lapply(htmltools::HTML)

EDU0m <- leaflet(KingEduJson) %>%
  setView(-121.979052, 47.45, 9) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
  fillColor = ~EDU0pal(EDU0),
  weight = 1,
  opacity = 1,
  color = "white",
  dashArray = "3",
  fillOpacity = 0.7,
  highlight = highlightOptions(
    weight = 5,
    color = "#666",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = EDU0labels,
  labelOptions = labelOptions(
    style = list("font-weight" = "normal", padding = "3px 8px"),
    textsize = "15px",
    direction = "auto"))%>%
  addLegend(pal = EDU0pal, values = EDU0c1, opacity = 0.7, title = "<center>Opertunity Index",
  position = "bottomleft",)
EDU0m

Reading Scores Map (EDU1)

#EDU1
#summary(EDU1)
EDU1ci <- (max(EDU1, na.rm = T) - min(EDU1, na.rm = T))/5
EDU1var <- EDU1ci
EDU1b <- c(-Inf, EDU1var + EDU1ci, EDU1var+ EDU1ci*2, EDU1var+EDU1ci*3, EDU1var+ EDU1ci*4, Inf)#%>%
  #percent()
#head(EDU1b_test, 5)
EDU1l <- c("1 – Very Low","2 – Low","3 – Moderate","4 – High","5 - Very High")
EDU1c1 <- cut(EDU1, EDU1b, EDU1l)
EDU1pal <- colorBin("YlOrRd", domain = EDU1, bins = EDU1b)

EDU1labels <- sprintf(
  "<h5><center>School Reading Proficiency:<br><center><strong>%s</strong></h5>
  <h5><center>Opertunity Index:<br><center><strong>%s</strong></h5>
  <h6><center>%s</h6>",
  EDU1, EduScore, NAMELSAD10
) %>% lapply(htmltools::HTML)

EDU1m <- leaflet(KingEduJson) %>%
  setView(-121.979052, 47.45, 9) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
  fillColor = ~EDU1pal(EDU1),
  weight = 1,
  opacity = 1,
  color = "white",
  dashArray = "3",
  fillOpacity = 0.7,
  highlight = highlightOptions(
    weight = 5,
    color = "#666",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = EDU1labels,
  labelOptions = labelOptions(
    style = list("font-weight" = "normal", padding = "3px 8px"),
    textsize = "15px",
    direction = "auto"))%>%
  addLegend(pal = EDU1pal, values = EDU1c1, opacity = 0.7, title = "<center>School Reading Proficiency",
  position = "bottomleft",)
EDU1m

Math Scores Map (EDU2)

#EDU2
#summary(EDU2)
EDU2ci <- (max(EDU2, na.rm = T) - min(EDU2, na.rm = T))/5
EDU2var <- EDU2ci
EDU2b <- c(-Inf, EDU2var + EDU2ci, EDU2var+ EDU2ci*2, EDU2var+EDU2ci*3, EDU2var+ EDU2ci*4, Inf)#%>%
  #percent()
#head(EDU2b_test, 5)
EDU2l <- c("1 – Very Low","2 – Low","3 – Moderate","4 – High","5 - Very High")
EDU2c1 <- cut(EDU2, EDU2b, EDU2l)
EDU2pal <- colorBin("YlOrRd", domain = EDU2, bins = EDU2b)

EDU2labels <- sprintf(
  "<h5><center>School Math Proficiency:<br><center><strong>%s</strong></h5>
  <h5><center>Opertunity Index:<br><center><strong>%s</strong></h5>
  <h6><center>%s</h6>",
  EDU2, EduScore, NAMELSAD10
) %>% lapply(htmltools::HTML)

EDU2m <- leaflet(KingEduJson) %>%
  setView(-121.979052, 47.45, 9) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
  fillColor = ~EDU2pal(EDU2),
  weight = 1,
  opacity = 1,
  color = "white",
  dashArray = "3",
  fillOpacity = 0.7,
  highlight = highlightOptions(
    weight = 5,
    color = "#666",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = EDU2labels,
  labelOptions = labelOptions(
    style = list("font-weight" = "normal", padding = "3px 8px"),
    textsize = "15px",
    direction = "auto"))%>%
  addLegend(pal = EDU2pal, values = EDU2c1, opacity = 0.7, title = "<center>School Math Proficiency",
  position = "bottomleft",)
EDU2m

Student Poverty Rates Map (EDU3)

#EDU3
#summary(EDU3)
EDU3ci <- (max(EDU3, na.rm = T) - min(EDU3, na.rm = T))/5
EDU3var <- EDU3ci
EDU3b <- c(-Inf, EDU3var + EDU3ci, EDU3var+ EDU3ci*2, EDU3var+EDU3ci*3, EDU3var+ EDU3ci*4, Inf)%>%
  percent()
#head(EDU3b_test, 5)
EDU3l <- c("1 – Very Low","2 – Low","3 – Moderate","4 – High","5 - Very High")
EDU3c1 <- cut(EDU3, EDU3b, EDU3l)
EDU3pal <- colorBin("YlOrRd", domain = EDU3, bins = EDU3b)

EDU3labels <- sprintf(
  "<h5><center>Poverty Rate:<br><center><strong>%s</strong></h5>
  <h5><center>Opertunity Index:<br><center><strong>%s</strong></h5>
  <h6><center>%s</h6>",
  percent(EDU3), EduScore, NAMELSAD10
) %>% lapply(htmltools::HTML)

EDU3m <- leaflet(KingEduJson) %>%
  setView(-121.979052, 47.45, 9) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
  fillColor = ~EDU3pal(EDU3),
  weight = 1,
  opacity = 1,
  color = "white",
  dashArray = "3",
  fillOpacity = 0.7,
  highlight = highlightOptions(
    weight = 5,
    color = "#666",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = EDU3labels,
  labelOptions = labelOptions(
    style = list("font-weight" = "normal", padding = "3px 8px"),
    textsize = "15px",
    direction = "auto"))%>%
  addLegend(pal = EDU3pal, values = EDU3c1, opacity = 0.7, title = '<center>% Students Receiving<br><center>Food Assistance',
  position = "bottomleft")
EDU3m

Teacher Quallifications Map (EDU4)

#EDU4
#summary(EDU4)
EDU4ci <- (max(EDU4, na.rm = T) - min(EDU4, na.rm = T))/5
EDU4var <- EDU4ci
EDU4b <- c(-Inf, EDU4var + EDU4ci, EDU4var+ EDU4ci*2, EDU4var+EDU4ci*3, EDU4var+ EDU4ci*4, Inf)%>%
  percent()
#head(EDU4b_test, 5)
EDU4l <- c("1 – Very Low","2 – Low","3 – Moderate","4 – High","5 - Very High")
EDU4c1 <- cut(EDU4, EDU4b, EDU4l)
EDU4pal <- colorBin("YlOrRd", domain = EDU4, bins = EDU4b)

EDU4labels <- sprintf(
  "<h5><center>Teachers with a<br><center>Master's Degree<br><center>or Higher:<br><center><strong>%s</strong></h5>
  <h5><center>Opertunity Index:<br><center><strong>%s</strong></h5>
  <h6><center>%s</h6>",
  percent(EDU4), EduScore, NAMELSAD10
) %>% lapply(htmltools::HTML)

EDU4m <- leaflet(KingEduJson) %>%
  setView(-121.979052, 47.45, 9) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
  fillColor = ~EDU4pal(EDU4),
  weight = 1,
  opacity = 1,
  color = "white",
  dashArray = "3",
  fillOpacity = 0.7,
  highlight = highlightOptions(
    weight = 5,
    color = "#666",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = EDU4labels,
  labelOptions = labelOptions(
    style = list("font-weight" = "normal", padding = "3px 8px"),
    textsize = "15px",
    direction = "auto"))%>%
  addLegend(pal = EDU4pal, values = EDU4c1, opacity = 0.7, title = "<center>% Teachers with a<br><center>Master's Degree or Higher",
  position = "bottomleft",)
EDU4m

Graduation Rates Map (EDU5)

#EDU5
#summary(EDU5)
EDU5ci <- (max(EDU5, na.rm = T) - min(EDU5, na.rm = T))/5
EDU5var <- EDU5ci
EDU5b <- c(-Inf, EDU5var + EDU5ci, EDU5var+ EDU5ci*2, EDU5var+EDU5ci*3, EDU5var+ EDU5ci*4, Inf)%>%
  percent()
#head(EDU5b_test, 5)
EDU5l <- c("1 – Very Low","2 – Low","3 – Moderate","4 – High","5 - Very High")
EDU5c1 <- cut(EDU5, EDU5b, EDU5l)
EDU5pal <- colorBin("YlOrRd", domain = EDU5, bins = EDU5b)

EDU5labels <- sprintf(
  "<h5><center>Graduation Rates:<br><center><strong>%s</strong></h5>
  <h5><center>Opertunity Index:<br><center><strong>%s</strong></h5>
  <h6><center>%s</h6>",
  percent(EDU5), EduScore, NAMELSAD10
) %>% lapply(htmltools::HTML)

EDU5m <- leaflet(KingEduJson) %>%
  setView(-121.979052, 47.45, 9) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
  fillColor = ~EDU5pal(EDU5),
  weight = 1,
  opacity = 1,
  color = "white",
  dashArray = "3",
  fillOpacity = 0.7,
  highlight = highlightOptions(
    weight = 5,
    color = "#666",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = EDU5labels,
  labelOptions = labelOptions(
    style = list("font-weight" = "normal", padding = "3px 8px"),
    textsize = "15px",
    direction = "auto"))%>%
  addLegend(pal = EDU5pal, values = EDU5c1, opacity = 0.7, title = "<center>Graduation Rates",
  position = "bottomleft",)
EDU5m

Conclusion

The data and analysis produced visual insights into the state of education opportunity in King County. The Opportunity Index Map displays the diversity in these opportunities yet shows how the Puget Sound Region has the widest range when compared to the rest of the County. The other five data sets and maps are able to show the areas that are in need of improvement in their opportunities to their students. These maps can be further analyzed to create a plan to improve the variables that may be hindering a student’s opportunities in obtaining a quality education. Further study could include population density of these Census Tracts to represent the Education Opportunity Index in a more accurate representation of the region.

Referances

Growing Transit Communities. “Opportunity Mapping.” Puget Sound Regional Council, 12 Mar. 2020, www.psrc.org/opportunity-mapping.

Vassilev. “Educational Indicators.” <i.Wikiprogress, 23 Aug. 2012, wikiprogress.org/articles/education-and-skills/educational-indicators/#What_should_an_education_indicator_measure.

Appendices

Maps

  1. Opportunity Index Map
  2. School Reading Proficiency Map
  3. School Math Proficiency Map
  4. Student Poverty Rates Map
  5. Teacher Qualifications Map
  6. Graduation Rates Map

  1. Opportunity Index Map

EDU0m

  1. School Reading Proficiency Map

EDU1m

  1. School Math Proficiency Map

EDU2m

  1. Student Poverty Rates Map

EDU3m

  1. Teacher Qualifications Map

EDU4m

  1. Graduation Rates Map

EDU5m